package abstracts1;
/*
    抽象类中的成员:
            //以下成员抽象类中都可以没有
             1.成员变量 : 可以有也可以有多个
             2.自定义常量 : 可以有也可以有多个
             *3. 构造方法 : 可以有也可以有多个
             虽然抽象类中有构造方法但是不可以创建对象!!
             4. 普通成员方法 : 可以有也可以有多个
             5. 静态成员方法 : 可以有也可以有多个
            *6. 抽象方法 : 可以有也可以有多个

    抽象类和普通类的区别在:
        1. 抽象类虽然有构造方法但是不可以创建对象
        2. 抽象类中可以有抽象方法

    抽象类和类之间是继承关系 ;


    抽象类一般都是作为父类存在,抽象类中的成员就可以使用子类对象去使用;
        子类继承抽象父类要重写抽象父类的所有抽象方法 或者 子类自己变成抽象类;

    接下来使用子类对象调用抽象父类中的非静态成员,
    抽象父类中的静态成员使用抽象父类的类名调用!

    抽象类一般都是作为父类的存在,约束子类的行为!
 */

public class Demo {
    public static void main(String[] args) {
        //Fu fu = new Fu();
        //创建Zi类对象
        Zi zi = new Zi();
        System.out.println("zi = " + zi.num);//使用成员变量
        System.out.println("zi = " + Fu.AUTHOR);
        System.out.println("Fu.AUTHOR = " + Fu.AUTHOR);
        zi.show();
        Fu.staticShow();
        zi.abstractShow();
    }
}
//子类自己变成抽象类
abstract class Son extends Fu{

}
//子类实现父类中所有的抽象方法
class Zi extends Fu{
    public Zi(){
        super();
    }
    @Override
    public void abstractShow() {
        System.out.println("子类实现的abstractShow方法");
    }
}

abstract class Fu{
    //1. 成员变量
    int num;
    //2. 自定义常量
    public static final String AUTHOR = "Damon";
    //3. 构造方法
    public Fu(){
        System.out.println("无参构造~");
    }
    public Fu(int num){
        System.out.println(num + "带参构造~");
    }

    //4. 普通成员方法
    public void show(){
        System.out.println("show~");
    }

    //5 静态成员方法
    public static void staticShow(){
        System.out.println("staticShow");
    }

    //抽象方法
    public abstract void abstractShow();
}
